package com.xhsj.user.utils;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @Author: liuqinghua
 * @Description:
 * @Data:2020/10/19
 */
@Slf4j
public class MyDateUtil {
    /**
     *这里共有2个时间段（b1-----e1）【b2-----e2】，4个时间点；
     *相当于两条线段(b代表起点，e代表端点，b<=e)，4个端点。
     *可分3种情况：
     *1.不相交。（b1-----e1）【b2-----e2】（b1-----e1）。if(e1<b2||b1>e2)此时，重合天数为零。
     *2.相交。
     *情况一：（b1---【b2---e1）----e2】          if(b1<b2&&e1<e2&&e1>b2)
     *情况二：【b2---(b1---e2】----e1)	   if(b1>b2&&b1<e2&&e2<e1)
     *3.包含：计算较短的时间段日期长度。
     *（b1---【b2-----e2】--e1）			   if(b1<b2&&e1>e2)
     *【b2---（b1-----e1）--e2】			   if(b1>b2&&e1<e2)
     * @param begindate1 开始日期
     * @param enddate1      结束日期
     * @param begindate2 开始日期
     * @param enddate2     结束日期
     * @return
     */
    public static BigDecimal getDayCoincidence(Date begindate1,Date enddate1,Date begindate2,Date enddate2){
        long b1=begindate1.getTime();
        long e1=enddate1.getTime();
        long b2=begindate2.getTime();
        long e2=enddate2.getTime();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begindate1);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);

        assert(b1<e1&&b2<e2);
        BigDecimal coincidenceday= null;
        if(b1<=b2&&e1>=e2){//（b1---【b2-----e2】--e1）
//            System.out.println("1包含2");
            coincidenceday=getDayDifference(enddate2,begindate2,0);
        }else if(b1>=b2&&e1<=e2){//【b2---（b1-----e1）--e2】
//            System.out.println("2包含1");
            coincidenceday=getDayDifference(enddate1,begindate1,hour);
        }else if(b1>=b2&&b1<=e2&&e2<=e1){//【b2---(b1---e2】----e1)
//            System.out.println("相交");
            coincidenceday=getDayDifference(enddate2,begindate1,hour);
        }else if(b1<=b2&&e1<=e2&&e1>=b2){//（b1---【b2---e1）----e2】
//            System.out.println("相交");
            coincidenceday=getDayDifference(enddate1,begindate2,0);
        }else if(e1<=b2||b1>=e2){
            coincidenceday= new BigDecimal(0);
        }else{
            coincidenceday= new BigDecimal(0);
//            System.out.println("意料外的日期组合，无法计算重合天数！");
        }

//        System.out.println("重合天数为["+coincidenceday+"]天。");
        return coincidenceday;
    }
    /**
     * 计算两个日期的相差天数(d1-d2)
     * @param d1
     * @param d2
     * @return
     */
    public static BigDecimal getDayDifference(Date d1,Date d2,int hour){
        BigDecimal times = null;
        try{
            long num = (d1.getTime()-d2.getTime())/1000;

            BigDecimal[] bigDecimals = new BigDecimal(num).divideAndRemainder(new BigDecimal(3600*24));
            BigDecimal days= bigDecimals[0];
            BigDecimal hours= bigDecimals[1];
//            if(days.compareTo(BigDecimal.ZERO) != 0){
                times = days.multiply(new BigDecimal(8));
//                ds.append(days+"天");
//            }
            if(hours.compareTo(new BigDecimal(15*3600)) == 1){
                hours = hours.subtract(new BigDecimal(15*3600));
            }
            if (hours.compareTo(BigDecimal.ZERO) != 0) {
//                BigDecimal divide = hours.divide(new BigDecimal(3600));
                // 超过3小时减一个小时且 12点之前
                BigDecimal overTreeTime =new BigDecimal(3*3600);
                if ((hours.compareTo(overTreeTime) == 1 && hour < 13) ||  hour == 12 ) {
                    hours = hours.subtract(new BigDecimal(3600));
//                    divide = hours.subtract(new BigDecimal(3600)).divide(new BigDecimal(3600)); .multiply(days.add(new BigDecimal(1))))
                }
                hours = hours.divide(new BigDecimal(3600));
                times = days.multiply(new BigDecimal(8)).add(hours);
//                if (divide.compareTo(BigDecimal.ZERO) != 0) {
//                    ds.append(divide+"小时");
//                }
            }


        }catch(Exception e){
//            ds=new StringBuffer("");
            e.printStackTrace();
            log.error("计算两个日期的相差天数异常", e);

        }
        return times;
    }


    public static Date stringToDate(String strDate) {
        if (strDate==null){return null;}
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }
    // 获取月份的第一天 和最后一天
    public static String getThisMonth(int year,int month) {
        // 本月的第一天
        Calendar calendar = new GregorianCalendar();

        //设置年份
        calendar.set(Calendar.YEAR, year);
        //设置月份
        calendar.set(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天

        SimpleDateFormat simpleFormate = new SimpleDateFormat("yyyy-MM-dd");
        String fd = simpleFormate.format(calendar.getTime());

        // 本月的最后一天

        calendar.set( Calendar.DATE,  1 );
        calendar.roll(Calendar.DATE,  - 1 );
        String ld = simpleFormate.format(calendar.getTime());
        return fd+","+ld;
    }
    public static void main(String[] args) throws ParseException {
//        String[] thisMonth=getThisMonth().split(",");
//        System.out.println(thisMonth[0]+"--------"+thisMonth[1]);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date begindate1 = dateFormat.parse("2021-04-01 09:00:00");
        Date enddate1 = dateFormat.parse("2021-04-01 18:00:00");
        Date begindate2 = dateFormat.parse("2021-04-01 09:00:00");
        Date enddate2 = dateFormat.parse("2021-04-01 18:00:00");
        System.out.println(getDayCoincidence(begindate1, enddate1, begindate2, enddate2));
    }
}


